#include <iostream>
#include <atomic>
#include <thread>
#include <vector>

// int main() {
//     std::atomic<int> count(0);
//     // 加载
//     int value = count.load();
//     std::cout << "count: " << value << std::endl;

//     // 存储
//     count.store(10);

//     // 原子地将 count 加1
//     count.fetch_add(1);

//     // 原子地将 count 减1
//     count.fetch_sub(1);

//     int expected = 10;
//     int desired = 5;
//     if(count.compare_exchange_strong(expected, desired)) {
//         // 如果 count 的当前值等于 expected，将其修改为 desired
//         std::cout << "compare and exchange success!" << std::endl;
//     }
//     else {
//         // 如果 count 的当前值不等于 expected，操作失败
//     }

//     value = count.exchange(15);
//     std::cout << "oldValue: " << value << std::endl;
//     std::cout << "newValue: " << count.load() << std::endl;


//     return 0;
// }

// std::atomic<int> turn(0);

// void printOdd(int range) {
//     for(int i = 0; i < range; i += 2) {
//         while(turn.load() != 0) {}
//         std::cout << "Odd: " << i << std::endl;
//         turn.store(1);
//     }
// }

// void printEvan(int range) {
//     for(int i = 1; i < range; i += 2) {
//         while(turn.load() != 1) {}
//         std::cout << "Evan: " << i << std::endl;
//         turn.store(0);
//     }
// }

// int main() {
//     std::thread t1(printEvan, 100);
//     std::thread t2(printOdd, 100);
//     t1.join();
//     t2.join();

//     return 0;
// }

// // 自旋锁
// std::atomic_flag spainLock = ATOMIC_FLAG_INIT;


// void func(int id) {
    
//     for(int i = 0; i < 10; i++) {
//         // 自选等待
//         while(spainLock.test_and_set()) {}
//         // 临界区
//         std::cout << "id: " << id<< std::endl;
//         spainLock.clear();
//     }
// }

// int main() {
//     std::vector<std::thread> threads;
//     for(int i = 0; i < 10; i++) {
//         threads.emplace_back(func, i);
//     }

//     for(auto& th : threads) {
//         th.join();
//     }
//     return 0;
// }

std::atomic<int> counter{0};

void incrementCounter() {
    for(int i = 0; i < 10000; ++i) {
        ++counter; // 原子递增
    }
}
int main() {
    
    // 计数器示例
    std::vector<std::thread> countingThreads;
    for(int i = 0; i < 8; ++i) {
        countingThreads.emplace_back(incrementCounter);
    }

    for(auto& t : countingThreads) {
        t.join();
    }

    std::cout << "Counter value: " << counter << std::endl; // 应输出1000000
    return 0;
}
